from datetime import datetime, date
import functools

import ujson


# 定义json 转换处理器
def json_formatting(o, seen=None):
    if seen is None:
        seen = set()

    if id(o) in seen:
        return None  # 或者返回一个特殊的标记，表示循环引用
    seen.add(id(o))

    if isinstance(o, (datetime, date)):
        return o.strftime("%Y-%m-%d %H:%M:%S")
    elif isinstance(o, (list, tuple)):
        return [json_formatting(item, seen) for item in o]
    elif isinstance(o, dict):
        return {key: json_formatting(value, seen) for key, value in o.items() if not key.startswith('_')}
    elif hasattr(o, '__dict__'):
        # 排除以 _ 开头的属性
        return json_formatting({k: v for k, v in o.__dict__.items() if not k.startswith('_')}, seen)
    return o


# 自定义 json.dumps 函数
custom_dumps = functools.partial(ujson.dumps, default=json_formatting)


def to_json(data):
    """
    将对象序列化为 JSON 格式字符串。
    :param data: 要序列化的对象
    :return: JSON 格式的字符串
    """
    return custom_dumps(data)


def to_dict(data):
    """
    将对象转换为字典。
    :param data: 要转换的对象
    :return: 字典
    """
    return json_formatting(data)
